<?php
/*
Plugin Name: the_excerpt Reloaded
Plugin URI: http://guff.szub.net/the-excerpt-reloaded/
Description: This mod of WordPress' template function the_excerpt() knows there is no spoon.
Version: R1
Author: Kaf Oseo
Author URI: http://szub.net

  Copyright (c) 2004, 2005 Kaf Oseo (http://szub.net)
  the_excerpt Reloaded is released under the GNU General Public
  License: http://www.gnu.org/licenses/gpl.txt

  This is a WordPress plugin (http://wordpress.org). WordPress is
  free software; you can redistribute it and/or modify it under the
  terms of the GNU General Public License as published by the Free
  Software Foundation; either version 2 of the License, or (at your
  option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  General Public License for more details.

  For a copy of the GNU General Public License, write to:

  Free Software Foundation, Inc.
  59 Temple Place, Suite 330
  Boston, MA  02111-1307
  USA

  You can also view a copy of the HTML version of the GNU General
  Public License at http://www.gnu.org/copyleft/gpl.html

~Changelog:
R1  (21-Aug-2005)
Lots of changes and additions. Now a full-blown Release version...

0.3 (20-Apr-2005)
Fixed '...' so it appears when expected; added 'all' argument to
allowedtags parameter (allows all HTML tags); altered filter_type
so if 'content' is the argument, WordPress text formatting occurs
(HTML paragraphs, 'fancy' punctuation, etc).

0.2 (16-Dec-2004)
Plugin now attempts to correct *broken* HTML tags (those allowed
through 'allowedtags') by using WP's balanceTags function.  This
is controlled through the 'fix_tags' parameter.

*/

function wp_the_excerpt_reloaded($args='') {
  parse_str($args);
  if(!isset($excerpt_length)) $excerpt_length = 120; // length of excerpt in words. -1 to display all excerpt/content
  if(!isset($allowedtags)) $allowedtags = '<a>'; // HTML tags allowed in excerpt, 'all' to allow all tags.
  if(!isset($filter_type)) $filter_type = 'none'; // format filter used => 'content', 'excerpt', 'content_rss', 'excerpt_rss', 'none'
  if(!isset($use_more_link)) $use_more_link = 1; // display
  if(!isset($more_link_text)) $more_link_text = "(more...)";
  if(!isset($force_more)) $force_more = 1;
  if(!isset($fakeit)) $fakeit = 1;
  if(!isset($fix_tags)) $fix_tags = 1;
  if(!isset($no_more)) $no_more = 0;
  if(!isset($more_tag)) $more_tag = 'div';
  if(!isset($more_link_title)) $more_link_title = 'Continue reading this entry';
  if(!isset($showdots)) $showdots = 1;

  return the_excerpt_reloaded($excerpt_length, $allowedtags, $filter_type, $use_more_link, $more_link_text, $force_more, $fakeit, $fix_tags, $no_more, $more_tag, $more_link_title, $showdots);
}

function the_excerpt_reloaded($excerpt_length=120, $allowedtags='<a>', $filter_type='none', $use_more_link=true, $more_link_text="(more...)", $force_more=true, $fakeit=1, $fix_tags=true, $no_more=false, $more_tag='div', $more_link_title='Continue reading this entry', $showdots=true) {
  if(preg_match('%^content($|_rss)|^excerpt($|_rss)%', $filter_type)) {
    $filter_type = 'the_' . $filter_type;
  }
  echo get_the_excerpt_reloaded($excerpt_length, $allowedtags, $filter_type, $use_more_link, $more_link_text, $force_more, $fakeit, $no_more, $more_tag, $more_link_title, $showdots);
}

function get_the_excerpt_reloaded($excerpt_length, $allowedtags, $filter_type, $use_more_link, $more_link_text, $force_more, $fakeit, $no_more, $more_tag, $more_link_title, $showdots) {
  global $post;

  if (!empty($post->post_password)) { // if there's a password
    if ($_COOKIE['wp-postpass_'.COOKIEHASH] != $post->post_password) { // and it doesn't match cookie
      if(is_feed()) { // if this runs in a feed
        $output = __('There is no excerpt because this is a protected post.');
      } else {
              $output = get_the_password_form();
      }
    }
    return $output;
  }

  if($fakeit == 2) { // force content as excerpt
    $text = $post->post_content;
  } elseif($fakeit == 1) { // content as excerpt, if no excerpt
    $text = (empty($post->post_excerpt)) ? $post->post_content : $post->post_excerpt;
  } else { // excerpt no matter what
    $text = $post->post_excerpt;
  }

  if($excerpt_length < 0) {
    $output = $text;
  } else {
    if(!$no_more && strpos($text, '<!--more-->')) {
        $text = explode('<!--more-->', $text, 2);
      $l = count($text[0]);
      $more_link = 1;
    } else {
      $text = explode(' ', $text);
      if(count($text) > $excerpt_length) {
        $l = $excerpt_length;
        $ellipsis = 1;
      } else {
        $l = count($text);
        $more_link_text = '';
        $ellipsis = 0;
      }
    }
    for ($i=0; $i<$l; $i++)
        $output .= $text[$i] . ' ';
  }

  if('all' != $allowed_tags) {
    $output = strip_tags($output, $allowedtags);
  }

//  $output = str_replace(array("\r\n", "\r", "\n", "  "), " ", $output);

  $output = rtrim($output, "\s\n\t\r\0\x0B");
  $output = ($fix_tags) ? $output : balanceTags($output);
  $output .= ($showdots && $ellipsis) ? '...' : '';

  switch($more_tag) {
    case('div') :
      $tag = 'div';
    break;
    case('span') :
      $tag = 'span';
    break;
    case('p') :
      $tag = 'p';
    break;
    default :
      $tag = 'span';
  }

  if ($use_more_link && $more_link_text) {
    if($force_more) {
      $output .= ' <' . $tag . ' class="more-link"><a href="'. get_permalink($post->ID) . '#more-' . $post->ID .'" title="' . $more_link_title . '">' . $more_link_text . '</a></' . $tag . '>' . "\n";
    } else {
      $output .= ' <' . $tag . ' class="more-link"><a href="'. get_permalink($post->ID) . '" title="' . $more_link_title . '">' . $more_link_text . '</a></' . $tag . '>' . "\n";
    }
  }

  $output = apply_filters($filter_type, $output);

  return $output;
}
?>